#!/bin/sh
####
##	fnordsense v0.1 :: indicate presense within muCCC hackerspace
#	Copyright (c) 2007 Munich, http://mucccc.de/fnordsense
#
# bootstrap
#
export PATH="~/bin:$PATH:.";
perl -e '' || (
  echo "$0 ERROR: Can't find perl interpreter in $PATH!" 1>&2
  echo "Add your perl path to the list at the top of this $0 file." 1>&2
  exit 1
)
perl -x "$0" $@
exit $?
#
# initialize
#
#!perl
use strict;
use Storable;
use LWP::UserAgent;
&loadProgramMeta();
#
# parse command line
#
use Getopt::Std;
our( %Conf, %opts );
getopts( 'Cdhqvu:r:l:', \%opts );
$Conf{'checkUrl'   } = $opts{'u'};
&showChangeLog()    if $opts{'C'};
$Conf{'diagnostics'} = $opts{'d'};
$Conf{'quiet'      } = $opts{'q'};
$Conf{'regex'      } = $opts{'t'};
$Conf{'logFile'    } = $opts{'l'};
&showHelp() if (
  (
    $opts{'h'} or
    $opts{'v'}
  ) or ! (
    $Conf{'checkUrl'  } and
    $Conf{'regex'     }
  )
);
undef %opts;
#
# debug mode?
#
if( $Conf{'diagnostics'} ) {
  use utf8;
  use warnings;
  use diagnostics;
}
&debug( 'initialized' );
#
#
#
print &getCopyright() if(
  (
    $Conf{'checkUrl'   } or
    $Conf{'help'       } or
    $Conf{'diagnostics'}
  ) and ! $Conf{'quiet'}
);
&main();
#
# returns copyright string
#
sub getCopyright { return <<COPYRIGHT;
####
##      $Conf{progName} v$Conf{version} :: $Conf{description}
#       Copyright (c) $Conf{copyrightYear} $Conf{copyrightHolder}, $Conf{www}

COPYRIGHT
}
#
# wrapper for changelog message
#
sub showChangeLog {
  print &getCopyright() . &getChangeLog();
  exit 0;
}
#
# wrapper for help message
#
sub showHelp {
  my @changes = split /\nv/, "\n" . &getChangeLog();
  print STDERR &getCopyright() . &getUsage();
  unless( $#changes == -1 ) {
    print STDERR "\nCHANGELOG:";
    for( my $i = 1; $i > -1; $i-- ) {
      next if $#changes <= $i;
      print STDERR "\nv" . $changes[ $#changes - $i ];
    }
  }
  exit 0;
}
#
# logs log messages with lvl error
#
sub error {
  return if $#_ == -1;
  warn &_log( 'ERROR', \@_, ( caller( 1 ) )[3] );
  exit 1;
}
#
# logs log messages with lvl alert
#
sub alert {
  return if $#_ == -1;
  warn &_log( 'ALERT', \@_, ( caller( 1 ) )[3] );
}
#
# logs log messages with lvl info
#
sub info {
  return if $#_ == -1;
  my $text = &_log( 'INFO', \@_, ( caller( 1 ) )[3] );
  print $text unless $Conf{'quiet'};
}
#
# logs log messages with lvl debug
#
sub debug {
  return unless $Conf{'diagnostics'};
  return if $#_ == -1;
  my $text = &_log( 'DEBUG', \@_, ( caller( 1 ) )[3] );
  print $text unless $Conf{'quiet'};
}
#
# backend function for logging messages
#
sub _log {
  #
  # build log message
  #
  my( $level, $caller ) = ( $_[0], $_[2] );
  my @messages = @{ $_[1] };
  $caller = 'main::unknown' unless $caller;
  $caller =~ s/main\:\://o;
  my $logMesg;
  my $time = localtime();
  $time =~ s/^\w+\ //o;
  $time =~ s/\ \d+$//o;
  #
  # verbose output
  # May 19 16:00:07 fnordsense[25784]/checkUrl   INFO : retrieving url ...
  #
  if( $Conf{'diagnostics'} ) {
    foreach my $mesg ( @messages ) {
      $logMesg .= sprintf(
        "$time $Conf{progName}\[$$\]/%-11s %-5s: %s\n",
        $caller,
        $level,
        $mesg
      );
    }
  #
  # normal output
  # May 19 16:00:07 INFO : retrieving url ...
  #
  } else {
    foreach my $mesg ( @messages ) {
      $logMesg .= sprintf( "$time %-5s: $mesg\n", $level );
    }
  }
  #
  # write log file
  #
  if( $Conf{'logFile'} ) {
    open LOG, '>>', $Conf{logFile}
      or die "Can't open log for writing: $!", @messages;
    print LOG $logMesg;
    close LOG or die "Can't write to log: $!", @messages;
  }
  return $logMesg;
}
#
# meta information about this program
#
sub loadProgramMeta {
  $Conf{'version'        } = '0.01';
  $Conf{'description'    } = "indicate presense withing muCCC hackerspace";
  $Conf{'progName'       } = $1 if $0 =~ /\/?([^\/]+)$/o;
  $Conf{'www'            } = "http://muccc..de/$Conf{progName}";
  $Conf{'copyrightHolder'} = 'CCC Munich';
  $Conf{'copyrightYear'  } = '2007';
}
#
# keep track of your changes...
#
sub getChangeLog { return <<'CHANGELOG';
v0.01 :: 2007-10-29 :: ssc@unixgu.ru
- started working on implementation with Url and Regex
CHANGELOG
}
#
# documents synopsis and usage information
#
sub getUsage{ return <<USAGE;
SYNOPSIS: [-Cdhqv ] [-u url] [-r regex] [-l file]
-C Changelog   -d perl Diagnostics    -hv show this Help     -q be Quiet    
-u fetch URL   -r regex for URL       -l  Log to file

URL   syntax: http[s]://[username[:password]@]host.com/page
regex syntax: pcre-compatible
See "man 1 fnordsense" for details.
USAGE
}
#
# main part of this program
#
sub main {
  $Conf{'www'} = LWP::UserAgent->new(
    'agent'         => "$0/$Conf{'version'}",
    'timeout'       => 23
  );
  $Conf{'www'}->env_proxy;
  }
  #
  # check some source for presence indication?
  #
  if( $Conf{'checkUrl'} ) {
    my $count = &checkUrl( $Conf{'checkUrl', $Conf{'regex'} );
    &info( 'checked URL ' . $Conf{'checkUrl'} );
  }
#
# check URL source
#
sub checUrl {
  my( $url, $regex } = @_;
  &info( 'checking URL ...' );

# TODO: modular: 1x check Url and strip xml, 1x count macs
# count mac addresses via regex
# dadurch faellt dann auch regex param weg und wird durch -m (mac address count) ersetzt

  my $resp = $Conf{'www'}->get($feed);
  next unless $resp->is_success();
  foreach my $item ( split /\<item[^\>]*\>/i, $resp->content() ) {
      #
      # clean from XML
      #
      $item =~ s/\r//go;
      $item =~ s/\<(?:link|title)\>([^\<]+)\<\/(?:link|title)\>/$1\n/go;
      $item =~ s/(?:\<[^\>]*\>|\&lt\;[^\&]+\&gt\;|\&\w{2,4}\;|[\=\-\_]{3,})//go;
      $item =~ s/(?:\n\s+|\n\s*\n)/\n/go;
      $item =~ s/\+/\ /go;
      $item = "\n$item" unless $item =~ /^\n/o;

      next if $db{'items'}{$item};
      $newItems{$item} = 1;
      $db{'items'}{$item} = time;
    }
  }

  return $count; 
}
